package File;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Ap0stoL2
 * Date: 2023-08-06
 * Time: 22:13
 */

//扫描指定目录，并找到名称中包含指定字符的所有普通文件（不包含目录），并且后续询问用户是否要删除该文件
//输入目录比如 d:/tmp  就从d:/tmp下的文件开始查找并且删除
import java.io.File;
import java.util.Scanner;

public class Demo10 {
    //后续任何方法类都可以使用他,就不需要每次进入方法都创建
    private static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        // 1. 让用户输入一个目录. 后续的查找都是针对这个目录来进行的.
        System.out.println("请输入要搜索的根目录: ");
        File rootPath = new File(scanner.next());
        // 2. 再让用户输入要搜索/要删除的关键词.
        System.out.println("请输入要删除的关键词: ");
        String word = scanner.next();
        // 3. 判定一下当前输入的目录是否有效.
        if (!rootPath.isDirectory()) {
            System.out.println("您此时输入的路径不是合法目录!");
            return;
        }
        // 4. 遍历目录. 从根目录出发, 按照 深度优先(递归) 的方式, 进行遍历
        scanDir(rootPath, word);
    }

    public static void scanDir(File currentDir, String word) {
        // 1. 先列出当前目录中都包含哪些内容.
        File[] files = currentDir.listFiles();
        if (files == null || files.length == 0) {
            // 空的目录或者非法的目录
            return;
        }
        // 2. 遍历列出的文件, 分两个情况分别讨论.
        for (File f : files) {
            // 加个日志, 方便看程序执行的过程(打印路径).
            System.out.println(f.getAbsolutePath());

            if (f.isFile()) {
                // 3. 如果当前文件是普通文件, 看看文件名是否包含了 word, 来决定是否要删除.
                dealFile(f, word);
            } else {
                // 4. 如果当前文件是目录文件, 就递归执行 scanDir
                scanDir(f, word);
            }
        }
    }

    private static void dealFile(File f, String word) {
        // 1. 先判定当前文件名是否包含 word,  string的contain方法
        if (!f.getName().contains(word)) {
            // 此时这个文件不包含 word 关键词. 直接跳过.
            return;
        }
        // 2. 包含 word 就需要询问用户是否要删除该文件?
        System.out.println("该文件是: " + f.getAbsolutePath() + ", 是否要确认删除? (Y/N)");
        String choice = scanner.next();
        if (choice.equals("Y") || choice.equals("y")) {
            f.delete();
        }
        // 如果是其他值, 都忽略(取消删除).


    }
}
